package com.naiterui.ehp.bs.patient.service;

import com.naiterui.common.repository.page.PageVO;
import com.naiterui.ehp.bp.bo.patient.RevisitDoctorBO;
import com.naiterui.ehp.bp.domain.Doctor;
import com.naiterui.ehp.bp.domain.Patient;
import com.naiterui.ehp.bp.support.exception.BusinessException;
import com.naiterui.ehp.bs.patient.utils.exception.PatientBusinessException;
import com.naiterui.ehp.bs.patient.vo.consult.ByConsultParamVO;
import com.naiterui.ehp.bs.patient.vo.doctor.ClinicDoctorVO;
import com.naiterui.ehp.bs.patient.vo.doctor.DoctorCheckVO;
import com.naiterui.ehp.bs.patient.vo.doctor.DoctorVO;
import com.naiterui.ehp.bs.patient.vo.patient.PersonalRelation;
import org.springframework.data.domain.Pageable;

import java.io.UnsupportedEncodingException;

/**
 * 患者医生相关业务接口服务
 *
 * @version 2015年6月22日 下午12:02:25 by Amber
 */
public interface IPatientDoctorService {

    /**
     * 根据患者id查询患者的所有私人医生列表ids
     *
     * @param patientId
     * @param accountStatus
     * @return
     * @Description IDoctorDao.getMyPrivateDoctor()
     * @Author linhf
     * @Date 2016年4月14日
     * @since 1.0.0
     */
    PageVO<DoctorVO> getMyPrivateDoctor(Long patientId, int page, int num, Integer accountStatus);

    /**
     * 绑定私人医生逻辑处理
     *
     * @param doctorId   医生推荐码
     * @param patientId  患者id
     * @param firstRecom 0:非首推；1：首推
     * @return DoctorVo <医生简单信息>
     * @throws BusinessException 医生不存在、用户异常、已经绑定过
     * @History 2015年6月21日 上午11:24:21 by Amber
     */
    PersonalRelation addPersonalDoctor(Long doctorId, Long patientId, Integer firstRecom, int source) throws Exception;

    /**
     * 根据医生id和患者id，查询医生和患者的私人关系 IPatientDoctorService.findPersonalDoctorByIds()
     *
     * @param doctorId
     * @param patientId
     * @return
     * @throws BusinessException
     * @Author chenlin
     * @Date 2016年11月16日
     * @since 1.0.0
     */
    PersonalRelation findPersonalDoctorByIds(Long doctorId, Long patientId) throws BusinessException;

    /**
     * 关注医生
     *
     * @param patientId 患者id
     * @param doctorId  医生id
     * @throws BusinessException 医生不存在、用户异常、已经关注过
     * @History 2015年6月21日 下午9:05:39 by Amber
     */
    DoctorVO addAttendDoctor(Long patientId, Long doctorId) throws BusinessException;

    /**
     * 取消关注
     *
     * @param patientId 患者id
     * @param doctorId  医生id
     * @throws BusinessException 没有关注该医生
     * @History 2015年6月21日 下午9:36:03 by Amber
     */
    DoctorVO deleteAttend(Long patientId, Long doctorId) throws BusinessException;

    /**
     * 获取患者医生列表
     *
     * @param patientId 患者id
     * @param page      页码
     * @param num       每页数量
     * @return void 医生vo列表
     * @History 2015年6月22日 下午12:13:35 by Amber
     */
    PageVO<DoctorVO> getMyDoctors(Long patientId, Pageable pageable, String scene) throws BusinessException;

    PageVO<DoctorVO> getClinicDoctors(Integer departmentId, Integer cityId, Long patientId, Long labelId,
        Pageable pageable, String keyword) throws BusinessException;

    /**
     * 获取专家名医列表
     *
     * @param departmentId
     *            部门ID
     * @param cityId
     *            城市ID
     * @param patientId
     *            患者ID
     * @param labelId
     *            1.专家名医 2.HIS医生
     * @param pageable
     * @param keyword
     *            关键词
     * @return
     * @throws BusinessException
     */
    PageVO<DoctorVO> getClinicDoctorList(Integer departmentId, Integer cityId, Long patientId, Long labelId,
        Pageable pageable, String keyword) throws BusinessException;

    /**
     * 医生详情
     *
     * @param doctorId  医生id
     * @param patientId 患者ID
     * @return
     * @throws Exception
     * @Return DoctorVo <医生详细信息>
     * @History 2015年6月22日 下午6:01:11 by Amber
     */
    DoctorVO getDoctorDetail(Long doctorId, Long patientId) throws BusinessException;

    /**
     * 新版专家名医详情
     *
     * @param patientId
     * @param doctorId
     * @return
     * @throws BusinessException
     */
    DoctorVO getClinicDetail(Long doctorId, Long patientId) throws BusinessException;

    /**
     * 老板专家名医详情
     *
     * @param patientId
     * @param doctorId
     * @return
     * @throws BusinessException
     */
    ClinicDoctorVO getClinicDoctorDetail(Long patientId, Long doctorId) throws BusinessException;

    /**
     * 查找医生
     *
     * @param keyword      关键字
     * @param departmentId 部门
     * @param cityId       城市
     * @param patientId    患者ID
     * @param page
     * @param num
     * @return PageVO<DoctorVo> <医生分页结果集>
     * @History 2015年6月23日 上午10:46:10 by Amber
     */
    PageVO<DoctorVO> findDoctors(String keyword, Integer departmentId, Integer cityId, Long patientId, int page, int num) throws BusinessException;

    /**
     * 搜索医生 从搜索服务查找医生 IPatientDoctorService.searchDoctors()<BR> <P>Author : Amber </P> <P>Date : 2015年8月17日 </P>
     *
     * @param keyword      关键字：医生名、医院名、城市名
     * @param departmentId 部门id
     * @param cityId       城市id
     * @param patientId    患者id
     * @param page         页码
     * @param num          每页数量
     * @return
     * @throws Exception
     */
    PageVO<DoctorVO> getDoctors(String keyword, Integer departmentId, Integer cityId, Long patientId, int page, int num) throws BusinessException,
        UnsupportedEncodingException;

    /**
     * 获取医生简报
     *
     * @param doctorId 医生id
     * @return DoctorVo <医生最简信息>
     * @History 2015年6月25日 下午2:42:05 by Amber
     */
    DoctorVO getSimpleDoctor(Long doctorId) throws Exception;

    /**
     * 获取医生粉丝数
     *
     * @param doctorId
     * @return
     * @throws Exception int <返回值描述>
     * @History 2015年6月26日 下午8:16:47 by Amber
     */
    int getDoctorFansNum(Long doctorId) throws Exception;

    /**
     * 获取医生姓名
     *
     * @param doctorId 医生id
     * @return Doctor <返回值描述>
     * @History 2015年7月4日 下午4:12:25 by Amber
     */
    String getDoctorName(Long doctorId);

    /**
     * <获取医生线上信息>
     *
     * @param doctorId 医生id
     * @return void <返回值描述>
     * @History 2015年7月7日 下午6:54:15 by Amber
     */
    boolean validateDoctorOnline(Long doctorId);

    /**
     * 数据库获取最新绑定的私人医生信息 IPatientDoctorService.getNewPersonalDoctor()<BR>
     * <P>Author : Amber </P> <P>Date : 2015年9月10日 </P>
     *
     * @param patientId 患者ID
     * @return
     * @throws Exception
     */
    DoctorVO getNewPersonalDoctor(Long patientId);

    /**
     * 是否已绑定该私人医生
     *
     * @param patientId 患者id
     * @param doctorId  医生id
     * @return boolean true：已绑定；false：未绑定
     * @History 2015年6月21日 下午9:57:23 by Amber
     */
    boolean getPersonalRelation(Long patientId, Long doctorId);

    /**
     * <医生绑定></p> 为患者设置首推医生
     *
     * @param patient  患者实体
     * @param doctorId
     * @return PersonalRelation <返回值描述>
     * @Throws 异常信息
     * @History 2015年11月5日 下午11:20:28 by Amber
     */
    PersonalRelation addDoctorToNewPatient(Patient patient, Long doctorId) throws Exception;

    /**
     * 根据患者id查询关注医生列表
     *
     * @param patientId
     * @param page
     * @param num
     * @return
     * @Description IPatientDoctorService.getPrivateDoctorList()
     * @Author linhf
     * @Date 2016年4月21日
     * @since 1.0.0
     */
    PageVO<DoctorVO> getPrivateDoctorList(Long patientId, int page, int num);

    /**
     * 根据医生id获取医生信息(目前只加入姓名,医院,科室,后期可以扩展加入其他属性) IPatientDoctorService.getDoctorByDoctorId()
     *
     * @param doctorId
     * @return
     * @throws Exception
     * @Author xuchong
     * @Date 2016年6月13日
     * @since 1.0.0
     */
    DoctorVO getDoctorByDoctorId(Long doctorId);

    /**
     * 获取最早绑定的医生（状态正常的医生，可能不是第一个绑定的医生） IPatientDoctorService.getFirstDoctorByPatient()
     *
     * @param patientId
     * @return
     * @Author xuchong
     * @Date 2016年8月17日
     * @since 1.0.0
     */
    Long getFirstDoctorByPatient(Long patientId);

    /**
     * @param patientId
     * @param doctorId
     * @throws PatientBusinessException
     * @Title: saveCheckedDoctor
     * @author: chengqiang
     * @Description: 记录处方需求清单患者选中的医生
     * @date: 2018年8月9日 下午7:15:56
     * @return: void
     */
    void saveCheckedDoctor(Long patientId, Long doctorId) throws PatientBusinessException;

    /**
     * 获取患者上级医生和私人医生情况 IPatientDoctorService.getRecomAndPersonalDoctorInfo()
     *
     * @param patientId
     * @return
     * @throws PatientBusinessException
     * @Date 2018年9月12日
     * @since 2.24
     */
    DoctorCheckVO getRecomAndPersonalDoctorInfo(Long patientId) throws PatientBusinessException;

    RevisitDoctorBO getRevisitDoctor(Long patientId, Long doctorId);

    /**
     * 切换医生、患者咨询(医患id)
     *
     * @param patientId
     * @param doctorId
     */
    Integer startChat(Long patientId, Long doctorId);

    /**
     * 切换医生、患者咨询(医患Bean)
     *
     * @param patient
     * @param doctor
     * @param needAuth
     */
    Integer startChat(Patient patient, Doctor doctor, boolean needAuth);

    Integer agreeDisclaimer(Long patientId, Long inquirerId, Long doctorId, Integer type, String recordId, Boolean agree, Integer consultType)
        throws BusinessException;

    /**
     * 患者填完病情发起咨询
     *
     * @param paramVO
     * @return
     * @throws BusinessException
     */
    Integer startConsult(ByConsultParamVO paramVO) throws BusinessException;


    /**
     * 获取医生详情（主页信息）
     * @param doctorId
     * @param patientId
     * @return
     * @throws BusinessException
     */
    DoctorVO findDoctorDetail(Long doctorId, Long patientId) throws BusinessException;


}
